#ifndef HEALTH_MODULE_H
#define HEALTH_MODULE_H

#include <Arduino.h>

/** send start sequence */
#define SEND_START_SEQ()                 \
    ;                                    \
    {                                    \
        Serial1.write(0x8A); \
    }
/** send end sequence */
#define SEND_END_SEQ()                   \
    ;                                    \
    {                                    \
        Serial1.write(0x88); \
    }

typedef struct
{
    uint8_t header;      // 数据头
    int8_t acdata[64]; // 心律波形数据
    uint8_t heartrate; // 心率
    uint8_t spo2;      // 血氧
    uint8_t bk;        // 微循环
    uint8_t fatig;     // 疲劳指数
    uint8_t rsv[2];    // 保留数据
    uint8_t rsv3;      // 收缩压
    uint8_t rsv4;      // 舒张压
    uint8_t rsv5;      // 心输出
    uint8_t rsn6;      // 外周阻力
    uint8_t rsv7;      // rr间期
    uint8_t sdnn;      // 心率变异性
    uint8_t rmssd;     // rmsd
    uint8_t nn50;      // nn50
    uint8_t pnn50;     // pnn50
    uint8_t rra[6];    // rr间期
    uint8_t _rsv;       // 保留
    uint8_t state;     // 模块状态
} BodyHeathSensor_t;

static bool health_module_has_data = false;
static BodyHeathSensor_t bhs;

void health_module_setup()
{
    Serial1.begin(38400);
    while (!Serial1)
        ;
    SEND_START_SEQ();
}

void health_module_close()
{
    SEND_END_SEQ();
}
void health_module_loop()
{
    // health sensor
    if (Serial1.available()) {
        // Serial.println("health_module_loop available");
        int data_len = Serial1.readBytes((uint8_t *)&bhs, sizeof(BodyHeathSensor_t));

        if (data_len != sizeof(BodyHeathSensor_t) || !(bhs.header == 0xFF && bhs.state == 0x01)) {
            // Serial.println("health_module_has_data = false");
            health_module_has_data = false;
            return;
        } else {
            // Serial.println("health_module_has_data = true");
            health_module_has_data = true;
        }
    } else {
        // Serial.println("health_module_loop not available");
    }
}

#endif // HEALTH_MODULE_H